compare genome size of temperate vs. lytic
inph.all <- inph
#inph<- subset(inph.all, inph.all$Jumbophage==FALSE)
ggplot(inph.all, aes(x = factor(f_spor), fill = factor(predicted_label), y = Genome.Length..bp.)) +
geom_boxplot(binaxis = "y", stackdir = "center", position = "dodge") + geom_jitter(width = 0.2) + scale_fill_manual(values=pal2, labels = c ("Temperate", "Lytic")) + ylab("Phage Genome Size (bp)") + xlab("") + ggtitle("INPHARED, with jumbophages") + labs(fill="Lifestyle")
Warning: Ignoring unknown parameters: `binaxis` and `stackdir`

# ggplot(inph, aes(x = factor(f_spor), fill = factor(predicted_label), y = Genome.Length..bp.))
# geom_boxplot(binaxis = "y", stackdir = "center", position = "dodge") + scale_fill_manual(values=pal2, labels = c ("Temperate", "Lytic")) + ylab("Phage # Genome Size (bp)") + xlab("") + ggtitle("INPHARED, no jumbophages") + labs(fill="Lifestyle")
inph.spor <- subset(inph.all, inph.all$f_spor==TRUE)
size.spor <- ggplot(inph.spor, aes(x = factor(predicted_label), fill = factor(predicted_label), y = Genome.Length..bp.)) +
geom_boxplot(binaxis = "y", stackdir = "center", position = "dodge") + geom_jitter(width = 0.2) + scale_fill_manual(values=pal2, labels = c ("Temperate", "Lytic")) + ylab("Phage Genome Size (bp)") + xlab("") + ggtitle("") + labs(fill="Lifestyle")+ ylim(0, 1000000)
Warning: Ignoring unknown parameters: `binaxis` and `stackdir`
inph.no <- subset(inph.all, inph.all$f_spor==FALSE)
size.no <- ggplot(inph.no, aes(x = factor(predicted_label), fill = factor(predicted_label), y = Genome.Length..bp.)) +
geom_boxplot(binaxis = "y", stackdir = "center", position = "dodge") + geom_jitter(width = 0.2) + scale_fill_manual(values=pal2, labels = c ("Temperate", "Lytic")) + ylab("Phage Genome Size (bp)") + xlab("") + ggtitle("") + labs(fill="Lifestyle") + ylim(0, 1000000) + theme(legend.position = "none")
Warning: Ignoring unknown parameters: `binaxis` and `stackdir`
genome.size <- plot_grid(size.no, size.spor, labels = c('Nonsporulating Host', 'Sporulating Host'), label_size = 12, rel_widths = c(1.5, 2))
genome.size

inph.all$f_spor <- as.factor(inph.all$f_spor)
inph.all$predicted_label <- as.factor(inph.all$predicted_label)
inph.all$Host <- as.factor(inph.all$Host)
#inph <- subset(inph, inph$Jumbophage==FALSE)
oneway <- aov(Genome.Length..bp. ~ predicted_label, data = inph.all)
summary(oneway)
Df Sum Sq Mean Sq F value Pr(>F)
predicted_label 1 1.270e+12 1.270e+12 669 <2e-16 ***
Residuals 3341 6.341e+12 1.898e+09
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
twoway <- aov(Genome.Length..bp. ~ predicted_label + f_spor, data = inph.all)
summary(twoway)
Df Sum Sq Mean Sq F value Pr(>F)
predicted_label 1 1.270e+12 1.270e+12 695.9 <2e-16 ***
f_spor 1 2.472e+11 2.472e+11 135.5 <2e-16 ***
Residuals 3340 6.094e+12 1.825e+09
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
twoway.int <- aov(Genome.Length..bp. ~ predicted_label * f_spor, data = inph.all)
summary(twoway.int)
Df Sum Sq Mean Sq F value Pr(>F)
predicted_label 1 1.270e+12 1.270e+12 705.9 < 2e-16 ***
f_spor 1 2.472e+11 2.472e+11 137.4 < 2e-16 ***
predicted_label:f_spor 1 8.795e+10 8.795e+10 48.9 3.25e-12 ***
Residuals 3339 6.006e+12 1.799e+09
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
block <- aov(Genome.Length..bp. ~predicted_label + f_spor + Host, data = inph.all)
summary(block)
Df Sum Sq Mean Sq F value Pr(>F)
predicted_label 1 1.270e+12 1.270e+12 925.30 <2e-16 ***
f_spor 1 2.472e+11 2.472e+11 180.11 <2e-16 ***
Host 55 1.586e+12 2.884e+10 21.02 <2e-16 ***
Residuals 3285 4.508e+12 1.372e+09
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
block_int <- aov(Genome.Length..bp. ~ predicted_label + f_spor * Host, data = inph.all)
summary(block_int)
Df Sum Sq Mean Sq F value Pr(>F)
predicted_label 1 1.270e+12 1.270e+12 925.30 <2e-16 ***
f_spor 1 2.472e+11 2.472e+11 180.11 <2e-16 ***
Host 55 1.586e+12 2.884e+10 21.02 <2e-16 ***
Residuals 3285 4.508e+12 1.372e+09
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
all_int <- aov(Genome.Length..bp. ~ predicted_label * f_spor * Host, data = inph.all)
summary(all_int)
Df Sum Sq Mean Sq F value Pr(>F)
predicted_label 1 1.270e+12 1.270e+12 1056.407 <2e-16 ***
f_spor 1 2.472e+11 2.472e+11 205.635 <2e-16 ***
Host 55 1.586e+12 2.884e+10 23.992 <2e-16 ***
predicted_label:f_spor 1 3.460e+09 3.460e+09 2.879 0.0898 .
predicted_label:Host 19 5.800e+11 3.053e+10 25.399 <2e-16 ***
Residuals 3265 3.924e+12 1.202e+09
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
library(AICcmodavg)
model.set <- list(oneway, twoway, twoway.int, block, block_int)
model.names <- c("one.way", "two.way", "interaction", "blocking", "block_int")
aictab(model.set, modnames = model.names)
Warning:
Check model structure carefully as some models may be redundant
Model selection based on AICc:
K AICc Delta_AICc AICcWt Cum.Wt LL
blocking 59 79884.43 0.00 0.5 0.5 -39882.14
block_int 59 79884.43 0.00 0.5 1.0 -39882.14
interaction 5 80733.51 849.08 0.0 1.0 -40361.74
two.way 4 80780.10 895.67 0.0 1.0 -40386.04
one.way 3 80911.01 1026.58 0.0 1.0 -40452.50
par(mfrow=c(2,2))
plot(twoway.int)
par(mfrow=c(1,1))

terms(block)
Genome.Length..bp. ~ predicted_label + f_spor + Host
attr(,"variables")
list(Genome.Length..bp., predicted_label, f_spor, Host)
attr(,"factors")
predicted_label f_spor Host
Genome.Length..bp. 0 0 0
predicted_label 1 0 0
f_spor 0 1 0
Host 0 0 1
attr(,"term.labels")
[1] "predicted_label" "f_spor" "Host"
attr(,"order")
[1] 1 1 1
attr(,"intercept")
[1] 1
attr(,"response")
[1] 1
attr(,".Environment")
<environment: R_GlobalEnv>
attr(,"predvars")
list(Genome.Length..bp., predicted_label, f_spor, Host)
attr(,"dataClasses")
Genome.Length..bp. predicted_label f_spor Host
"numeric" "factor" "factor" "factor"
TukeyHSD(block) # or:
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = Genome.Length..bp. ~ predicted_label + f_spor + Host, data = inph.all)
$predicted_label
diff lwr upr p adj
virulent-temperate 39312.13 36778.2 41846.05 0
$f_spor
diff lwr upr p adj
TRUE-FALSE 20058.93 17128.38 22989.48 0
$Host
diff lwr upr p adj
Acutalibacter-Acetoanaerobium 23239.65278 -189290.98121 235770.2868 1.0000000
Aeribacillus-Acetoanaerobium 15545.00000 -196985.63400 228075.6340 1.0000000
Aerococcus-Acetoanaerobium 78596.64853 -133933.98546 291127.2825 1.0000000
Agathobaculum-Acetoanaerobium -30482.00425 -214538.93238 153574.9239 1.0000000
Alicyclobacillus-Acetoanaerobium 44861.99575 -167668.63825 257392.6297 1.0000000
Amedibacillus-Acetoanaerobium -23787.00000 -207843.92813 160269.9281 1.0000000
Anaerostipes-Acetoanaerobium 403.00000 -173127.53600 173933.5360 1.0000000
Anoxybacillus-Acetoanaerobium 4786.00000 -207744.63400 217316.6340 1.0000000
Bacillus-Acetoanaerobium 40954.55007 -109488.80905 191397.9092 1.0000000
Blautia-Acetoanaerobium 10005.00000 -202525.63400 222535.6340 1.0000000
Brevibacillus-Acetoanaerobium 24156.99884 -132807.27687 181121.2745 1.0000000
Brochothrix-Acetoanaerobium 39461.15119 -119936.82431 198859.1267 1.0000000
Butyrivibrio-Acetoanaerobium -22850.50212 -185173.45509 139472.4508 1.0000000
Caldibacillus-Acetoanaerobium 1255.00000 -211275.63400 213785.6340 1.0000000
Carnobacterium-Acetoanaerobium 1754.98187 -171775.55413 175285.5179 1.0000000
Clostridioides-Acetoanaerobium 34463.30000 -119529.77437 188456.3744 1.0000000
Clostridium-Acetoanaerobium -11841.15277 -162691.18066 139008.8751 1.0000000
Cytobacillus-Acetoanaerobium -52949.00425 -265479.63825 159581.6297 1.0000000
Dorea-Acetoanaerobium 2259.00000 -210271.63400 214789.6340 1.0000000
Enterocloster-Acetoanaerobium 65725.83333 -96597.11963 228048.7863 0.9999992
Enterococcus-Acetoanaerobium 20756.67217 -129767.37526 171280.7196 1.0000000
Erysipelothrix-Acetoanaerobium 26437.50000 -157619.42813 210494.4281 1.0000000
Faecalibacterium-Acetoanaerobium 3530.33227 -152887.97908 159948.6436 1.0000000
Flavonifractor-Acetoanaerobium -3910.35005 -177440.88605 169620.1860 1.0000000
Geobacillus-Acetoanaerobium 5710.53248 -149499.89739 160920.9624 1.0000000
Hungatella-Acetoanaerobium -59354.00425 -271884.63825 153176.6297 1.0000000
Kurthia-Acetoanaerobium -20206.00000 -232736.63400 192324.6340 1.0000000
Lacticaseibacillus-Acetoanaerobium 15691.90278 -138301.17159 169684.9772 1.0000000
Lactiplantibacillus-Acetoanaerobium 24167.15066 -159889.77747 208224.0788 1.0000000
Lactobacillus-Acetoanaerobium 28431.63125 -122607.31347 179470.5760 1.0000000
Lactococcus-Acetoanaerobium -13311.33588 -163778.15074 137155.4790 1.0000000
Latilactobacillus-Acetoanaerobium 21916.58136 -133639.91456 177473.0773 1.0000000
Leuconostoc-Acetoanaerobium -19077.30891 -172458.08235 134303.4645 1.0000000
Levilactobacillus-Acetoanaerobium 83466.64853 -129063.98546 295997.2825 0.9999997
Liquorilactobacillus-Acetoanaerobium -27294.35147 -239824.98546 185236.2825 1.0000000
Listeria-Acetoanaerobium 42312.33319 -108690.29973 193314.9661 1.0000000
Lysinibacillus-Acetoanaerobium 44205.79745 -120419.72376 208831.3187 1.0000000
Mammaliicoccus-Acetoanaerobium 89183.64853 -84346.88747 262714.1845 0.9991623
Moorella-Acetoanaerobium 42648.99788 -141407.93025 226705.9260 1.0000000
Oenococcus-Acetoanaerobium 9655.93728 -151002.12087 170313.9954 1.0000000
Paenibacillus-Acetoanaerobium 3791.74965 -147270.79307 154854.2924 1.0000000
Parageobacillus-Acetoanaerobium 11176.50000 -172880.42813 195233.4281 1.0000000
Pediococcus-Acetoanaerobium -17196.35147 -229726.98546 195334.2825 1.0000000
Peptoclostridium-Acetoanaerobium 95265.00000 -117265.63400 307795.6340 0.9999801
Psychrobacillus-Acetoanaerobium 39429.00000 -134101.53600 212959.5360 1.0000000
Roseburia-Acetoanaerobium 9249.00000 -174807.92813 193305.9281 1.0000000
Ruminococcus-Acetoanaerobium 1041.00000 -161281.95297 163363.9530 1.0000000
Sporosarcina-Acetoanaerobium -10752.00425 -223282.63825 201778.6297 1.0000000
Staphylococcus-Acetoanaerobium 49046.61951 -101337.01551 199430.2545 1.0000000
Streptococcus-Acetoanaerobium 20453.54831 -129924.97958 170832.0762 1.0000000
Terrisporobacter-Acetoanaerobium 6451.50000 -161568.71900 174471.7190 1.0000000
Tetragenococcus-Acetoanaerobium 1481.15278 -182575.77534 185538.0809 1.0000000
Thermoanaerobacterium-Acetoanaerobium 5877.00000 -206653.63400 218407.6340 1.0000000
Virgibacillus-Acetoanaerobium 11955.00000 -200575.63400 224485.6340 1.0000000
Weissella-Acetoanaerobium 4116.50871 -156541.54944 164774.5669 1.0000000
Weizmannia-Acetoanaerobium -22366.00425 -234896.63825 190164.6297 1.0000000
Aeribacillus-Acutalibacter -7694.65278 -220225.28678 204835.9812 1.0000000
Aerococcus-Acutalibacter 55356.99575 -157173.63825 267887.6297 1.0000000
Agathobaculum-Acutalibacter -53721.65703 -237778.58516 130335.2711 1.0000000
Alicyclobacillus-Acutalibacter 21622.34297 -190908.29103 234152.9770 1.0000000
Amedibacillus-Acutalibacter -47026.65278 -231083.58091 137030.2753 1.0000000
Anaerostipes-Acutalibacter -22836.65278 -196367.18879 150693.8832 1.0000000
Anoxybacillus-Acutalibacter -18453.65278 -230984.28678 194076.9812 1.0000000
Bacillus-Acutalibacter 17714.89728 -132728.46183 168158.2564 1.0000000
Blautia-Acutalibacter -13234.65278 -225765.28678 199295.9812 1.0000000
Brevibacillus-Acutalibacter 917.34606 -156046.92965 157881.6218 1.0000000
Brochothrix-Acutalibacter 16221.49841 -143176.47709 175619.4739 1.0000000
Butyrivibrio-Acutalibacter -46090.15491 -208413.10787 116232.7981 1.0000000
Caldibacillus-Acutalibacter -21984.65278 -234515.28678 190545.9812 1.0000000
Carnobacterium-Acutalibacter -21484.67092 -195015.20692 152045.8651 1.0000000
Clostridioides-Acutalibacter 11223.64722 -142769.42715 165216.7216 1.0000000
Clostridium-Acutalibacter -35080.80555 -185930.83345 115769.2223 1.0000000
Cytobacillus-Acutalibacter -76188.65703 -288719.29103 136341.9770 1.0000000
Dorea-Acutalibacter -20980.65278 -233511.28678 191549.9812 1.0000000
Enterocloster-Acutalibacter 42486.18055 -119836.77242 204809.1335 1.0000000
Enterococcus-Acutalibacter -2482.98061 -153007.02805 148041.0668 1.0000000
Erysipelothrix-Acutalibacter 3197.84722 -180859.08091 187254.7753 1.0000000
Faecalibacterium-Acutalibacter -19709.32051 -176127.63187 136708.9908 1.0000000
Flavonifractor-Acutalibacter -27150.00283 -200680.53884 146380.5332 1.0000000
Geobacillus-Acutalibacter -17529.12030 -172739.55017 137681.3096 1.0000000
Hungatella-Acutalibacter -82593.65703 -295124.29103 129936.9770 0.9999998
Kurthia-Acutalibacter -43445.65278 -255976.28678 169084.9812 1.0000000
Lacticaseibacillus-Acutalibacter -7547.75000 -161540.82437 146445.3244 1.0000000
Lactiplantibacillus-Acutalibacter 927.49788 -183129.43025 184984.4260 1.0000000
Lactobacillus-Acutalibacter 5191.97847 -145846.96625 156230.9232 1.0000000
Lactococcus-Acutalibacter -36550.98867 -187017.80353 113915.8262 1.0000000
Latilactobacillus-Acutalibacter -1323.07143 -156879.56735 154233.4245 1.0000000
Leuconostoc-Acutalibacter -42316.96170 -195697.73514 111063.8117 1.0000000
Levilactobacillus-Acutalibacter 60226.99575 -152303.63825 272757.6297 1.0000000
Liquorilactobacillus-Acutalibacter -50534.00425 -263064.63825 161996.6297 1.0000000
Listeria-Acutalibacter 19072.68040 -131929.95251 170075.3133 1.0000000
Lysinibacillus-Acutalibacter 20966.14467 -143659.37654 185591.6659 1.0000000
Mammaliicoccus-Acutalibacter 65943.99575 -107586.54025 239474.5318 0.9999999
Moorella-Acutalibacter 19409.34509 -164647.58303 203466.2732 1.0000000
Oenococcus-Acutalibacter -13583.71550 -174241.77366 147074.3427 1.0000000
Paenibacillus-Acutalibacter -19447.90314 -170510.44585 131614.6396 1.0000000
Parageobacillus-Acutalibacter -12063.15278 -196120.08091 171993.7753 1.0000000
Pediococcus-Acutalibacter -40436.00425 -252966.63825 172094.6297 1.0000000
Peptoclostridium-Acutalibacter 72025.34722 -140505.28678 284555.9812 1.0000000
Psychrobacillus-Acutalibacter 16189.34722 -157341.18879 189719.8832 1.0000000
Roseburia-Acutalibacter -13990.65278 -198047.58091 170066.2753 1.0000000
Ruminococcus-Acutalibacter -22198.65278 -184521.60575 140124.3002 1.0000000
Sporosarcina-Acutalibacter -33991.65703 -246522.29103 178538.9770 1.0000000
Staphylococcus-Acutalibacter 25806.96672 -124576.66829 176190.6017 1.0000000
Streptococcus-Acutalibacter -2786.10448 -153164.63236 147592.4234 1.0000000
Terrisporobacter-Acutalibacter -16788.15278 -184808.37178 151232.0662 1.0000000
Tetragenococcus-Acutalibacter -21758.50000 -205815.42813 162298.4281 1.0000000
Thermoanaerobacterium-Acutalibacter -17362.65278 -229893.28678 195167.9812 1.0000000
Virgibacillus-Acutalibacter -11284.65278 -223815.28678 201245.9812 1.0000000
Weissella-Acutalibacter -19123.14407 -179781.20223 141534.9141 1.0000000
Weizmannia-Acutalibacter -45605.65703 -258136.29103 166924.9770 1.0000000
Aerococcus-Aeribacillus 63051.64853 -149478.98546 275582.2825 1.0000000
Agathobaculum-Aeribacillus -46027.00425 -230083.93238 138029.9239 1.0000000
Alicyclobacillus-Aeribacillus 29316.99575 -183213.63825 241847.6297 1.0000000
Amedibacillus-Aeribacillus -39332.00000 -223388.92813 144724.9281 1.0000000
Anaerostipes-Aeribacillus -15142.00000 -188672.53600 158388.5360 1.0000000
Anoxybacillus-Aeribacillus -10759.00000 -223289.63400 201771.6340 1.0000000
Bacillus-Aeribacillus 25409.55007 -125033.80905 175852.9092 1.0000000
Blautia-Aeribacillus -5540.00000 -218070.63400 206990.6340 1.0000000
Brevibacillus-Aeribacillus 8611.99884 -148352.27687 165576.2745 1.0000000
Brochothrix-Aeribacillus 23916.15119 -135481.82431 183314.1267 1.0000000
Butyrivibrio-Aeribacillus -38395.50212 -200718.45509 123927.4508 1.0000000
Caldibacillus-Aeribacillus -14290.00000 -226820.63400 198240.6340 1.0000000
Carnobacterium-Aeribacillus -13790.01813 -187320.55413 159740.5179 1.0000000
Clostridioides-Aeribacillus 18918.30000 -135074.77437 172911.3744 1.0000000
Clostridium-Aeribacillus -27386.15277 -178236.18066 123463.8751 1.0000000
Cytobacillus-Aeribacillus -68494.00425 -281024.63825 144036.6297 1.0000000
Dorea-Aeribacillus -13286.00000 -225816.63400 199244.6340 1.0000000
Enterocloster-Aeribacillus 50180.83333 -112142.11963 212503.7863 1.0000000
Enterococcus-Aeribacillus 5211.67217 -145312.37526 155735.7196 1.0000000
Erysipelothrix-Aeribacillus 10892.50000 -173164.42813 194949.4281 1.0000000
Faecalibacterium-Aeribacillus -12014.66773 -168432.97908 144403.6436 1.0000000
Flavonifractor-Aeribacillus -19455.35005 -192985.88605 154075.1860 1.0000000
Geobacillus-Aeribacillus -9834.46752 -165044.89739 145375.9624 1.0000000
Hungatella-Aeribacillus -74899.00425 -287429.63825 137631.6297 1.0000000
Kurthia-Aeribacillus -35751.00000 -248281.63400 176779.6340 1.0000000
Lacticaseibacillus-Aeribacillus 146.90278 -153846.17159 154139.9772 1.0000000
Lactiplantibacillus-Aeribacillus 8622.15066 -175434.77747 192679.0788 1.0000000
Lactobacillus-Aeribacillus 12886.63125 -138152.31347 163925.5760 1.0000000
Lactococcus-Aeribacillus -28856.33588 -179323.15074 121610.4790 1.0000000
Latilactobacillus-Aeribacillus 6371.58136 -149184.91456 161928.0773 1.0000000
Leuconostoc-Aeribacillus -34622.30891 -188003.08235 118758.4645 1.0000000
Levilactobacillus-Aeribacillus 67921.64853 -144608.98546 280452.2825 1.0000000
Liquorilactobacillus-Aeribacillus -42839.35147 -255369.98546 169691.2825 1.0000000
Listeria-Aeribacillus 26767.33319 -124235.29973 177769.9661 1.0000000
Lysinibacillus-Aeribacillus 28660.79745 -135964.72376 193286.3187 1.0000000
Mammaliicoccus-Aeribacillus 73638.64853 -99891.88747 247169.1845 0.9999964
Moorella-Aeribacillus 27103.99788 -156952.93025 211160.9260 1.0000000
Oenococcus-Aeribacillus -5889.06272 -166547.12087 154768.9954 1.0000000
Paenibacillus-Aeribacillus -11753.25035 -162815.79307 139309.2924 1.0000000
Parageobacillus-Aeribacillus -4368.50000 -188425.42813 179688.4281 1.0000000
Pediococcus-Aeribacillus -32741.35147 -245271.98546 179789.2825 1.0000000
Peptoclostridium-Aeribacillus 79720.00000 -132810.63400 292250.6340 0.9999999
Psychrobacillus-Aeribacillus 23884.00000 -149646.53600 197414.5360 1.0000000
Roseburia-Aeribacillus -6296.00000 -190352.92813 177760.9281 1.0000000
Ruminococcus-Aeribacillus -14504.00000 -176826.95297 147818.9530 1.0000000
Sporosarcina-Aeribacillus -26297.00425 -238827.63825 186233.6297 1.0000000
Staphylococcus-Aeribacillus 33501.61951 -116882.01551 183885.2545 1.0000000
Streptococcus-Aeribacillus 4908.54831 -145469.97958 155287.0762 1.0000000
Terrisporobacter-Aeribacillus -9093.50000 -177113.71900 158926.7190 1.0000000
Tetragenococcus-Aeribacillus -14063.84722 -198120.77534 169993.0809 1.0000000
Thermoanaerobacterium-Aeribacillus -9668.00000 -222198.63400 202862.6340 1.0000000
Virgibacillus-Aeribacillus -3590.00000 -216120.63400 208940.6340 1.0000000
Weissella-Aeribacillus -11428.49129 -172086.54944 149229.5669 1.0000000
Weizmannia-Aeribacillus -37911.00425 -250441.63825 174619.6297 1.0000000
Agathobaculum-Aerococcus -109078.65278 -293135.58091 74978.2753 0.9827791
Alicyclobacillus-Aerococcus -33734.65278 -246265.28678 178795.9812 1.0000000
Amedibacillus-Aerococcus -102383.64853 -286440.57666 81673.2796 0.9949667
Anaerostipes-Aerococcus -78193.64853 -251724.18454 95336.8875 0.9999767
Anoxybacillus-Aerococcus -73810.64853 -286341.28253 138719.9855 1.0000000
Bacillus-Aerococcus -37642.09847 -188085.45758 112801.2606 1.0000000
Blautia-Aerococcus -68591.64853 -281122.28253 143938.9855 1.0000000
Brevibacillus-Aerococcus -54439.64969 -211403.92540 102524.6260 1.0000000
Brochothrix-Aerococcus -39135.49734 -198533.47284 120262.4782 1.0000000
Butyrivibrio-Aerococcus -101447.15066 -263770.10363 60875.8023 0.9580891
Caldibacillus-Aerococcus -77341.64853 -289872.28253 135188.9855 1.0000000
Carnobacterium-Aerococcus -76841.66667 -250372.20267 96688.8693 0.9999863
Clostridioides-Aerococcus -44133.34853 -198126.42290 109859.7258 1.0000000
Clostridium-Aerococcus -90437.80130 -241287.82920 60412.2266 0.9788729
Cytobacillus-Aerococcus -131545.65278 -344076.28678 80984.9812 0.9640153
Dorea-Aerococcus -76337.64853 -288868.28253 136192.9855 1.0000000
Enterocloster-Aerococcus -12870.81520 -175193.76817 149452.1378 1.0000000
Enterococcus-Aerococcus -57839.97636 -208364.02380 92684.0711 0.9999999
Erysipelothrix-Aerococcus -52159.14853 -236216.07666 131897.7796 1.0000000
Faecalibacterium-Aerococcus -75066.31626 -231484.62762 81351.9951 0.9998581
Flavonifractor-Aerococcus -82506.99858 -256037.53459 91023.5374 0.9998903
Geobacillus-Aerococcus -72886.11605 -228096.54592 82324.3138 0.9999225
Hungatella-Aerococcus -137950.65278 -350481.28678 74579.9812 0.9269790
Kurthia-Aerococcus -98802.64853 -311333.28253 113727.9855 0.9999419
Lacticaseibacillus-Aerococcus -62904.74575 -216897.82012 91088.3286 0.9999990
Lactiplantibacillus-Aerococcus -54429.49788 -238486.42600 129627.4303 1.0000000
Lactobacillus-Aerococcus -50165.01728 -201203.96200 100873.9274 1.0000000
Lactococcus-Aerococcus -91907.98442 -242374.79928 58558.8304 0.9709805
Latilactobacillus-Aerococcus -56680.06718 -212236.56310 98876.4287 1.0000000
Leuconostoc-Aerococcus -97673.95745 -251054.73089 55706.8160 0.9443662
Levilactobacillus-Aerococcus 4870.00000 -207660.63400 217400.6340 1.0000000
Liquorilactobacillus-Aerococcus -105891.00000 -318421.63400 106639.6340 0.9996156
Listeria-Aerococcus -36284.31535 -187286.94826 114718.3176 1.0000000
Lysinibacillus-Aerococcus -34390.85108 -199016.37229 130234.6701 1.0000000
Mammaliicoccus-Aerococcus 10587.00000 -162943.53600 184117.5360 1.0000000
Moorella-Aerococcus -35947.65066 -220004.57878 148109.2775 1.0000000
Oenococcus-Aerococcus -68940.71125 -229598.76941 91717.3469 0.9999949
Paenibacillus-Aerococcus -74804.89889 -225867.44160 76257.6438 0.9996721
Parageobacillus-Aerococcus -67420.14853 -251477.07666 116636.7796 1.0000000
Pediococcus-Aerococcus -95793.00000 -308323.63400 116737.6340 0.9999766
Peptoclostridium-Aerococcus 16668.35147 -195862.28253 229198.9855 1.0000000
Psychrobacillus-Aerococcus -39167.64853 -212698.18454 134362.8875 1.0000000
Roseburia-Aerococcus -69347.64853 -253404.57666 114709.2796 0.9999999
Ruminococcus-Aerococcus -77555.64853 -239878.60150 84767.3044 0.9998744
Sporosarcina-Aerococcus -89348.65278 -301879.28678 123181.9812 0.9999974
Staphylococcus-Aerococcus -29550.02903 -179933.66405 120833.6060 1.0000000
Streptococcus-Aerococcus -58143.10023 -208521.62811 92235.4277 0.9999998
Terrisporobacter-Aerococcus -72145.14853 -240165.36753 95875.0705 0.9999948
Tetragenococcus-Aerococcus -77115.49575 -261172.42388 106941.4324 0.9999976
Thermoanaerobacterium-Aerococcus -72719.64853 -285250.28253 139810.9855 1.0000000
Virgibacillus-Aerococcus -66641.64853 -279172.28253 145888.9855 1.0000000
Weissella-Aerococcus -74480.13982 -235138.19798 86177.9183 0.9999463
Weizmannia-Aerococcus -100962.65278 -313493.28678 111567.9812 0.9998929
Alicyclobacillus-Agathobaculum 75344.00000 -108712.92813 259400.9281 0.9999989
Amedibacillus-Agathobaculum 6695.00425 -143586.84826 156976.8568 1.0000000
Anaerostipes-Agathobaculum 30885.00425 -106302.93009 168072.9386 1.0000000
Anoxybacillus-Agathobaculum 35268.00425 -148788.92388 219324.9324 1.0000000
Bacillus-Agathobaculum 71436.55431 -35057.04505 177930.1537 0.8877036
Blautia-Agathobaculum 40487.00425 -143569.92388 224543.9324 1.0000000
Brevibacillus-Agathobaculum 54639.00309 -60883.57588 170161.5821 0.9999052
Brochothrix-Agathobaculum 69943.15544 -48865.08079 188751.3917 0.9847342
Butyrivibrio-Agathobaculum 7631.50212 -115073.11663 130336.1209 1.0000000
Caldibacillus-Agathobaculum 31737.00425 -152319.92388 215793.9324 1.0000000
Carnobacterium-Agathobaculum 32236.98612 -104950.94822 169424.9205 1.0000000
Clostridioides-Agathobaculum 64945.30425 -46506.70047 176397.3090 0.9873647
Clostridium-Agathobaculum 18640.85148 -88426.47929 125708.1822 1.0000000
Cytobacillus-Agathobaculum -22467.00000 -206523.92813 161589.9281 1.0000000
Dorea-Agathobaculum 32741.00425 -151315.92388 216797.9324 1.0000000
Enterocloster-Agathobaculum 96207.83758 -26496.78117 218912.4563 0.5342628
Enterococcus-Agathobaculum 51238.67642 -55368.88081 157846.2337 0.9998522
Erysipelothrix-Agathobaculum 56919.50425 -93362.34826 207201.3568 0.9999999
Faecalibacterium-Agathobaculum 34012.33652 -80767.32426 148791.9973 1.0000000
Flavonifractor-Agathobaculum 26571.65420 -110616.28014 163759.5885 1.0000000
Geobacillus-Agathobaculum 36192.53673 -76935.53204 149320.6055 1.0000000
Hungatella-Agathobaculum -28872.00000 -212928.92813 155184.9281 1.0000000
Kurthia-Agathobaculum 10276.00425 -173780.92388 194332.9324 1.0000000
Lacticaseibacillus-Agathobaculum 46173.90703 -65278.09769 157625.9118 0.9999984
Lactiplantibacillus-Agathobaculum 54649.15491 -95632.69760 204931.0074 1.0000000
Lactobacillus-Agathobaculum 58913.63550 -48419.70147 166246.9725 0.9962060
Lactococcus-Agathobaculum 17170.66837 -89356.06432 123697.4011 1.0000000
Latilactobacillus-Agathobaculum 52398.58561 -61203.81677 166000.9880 0.9999537
Leuconostoc-Agathobaculum 11404.69534 -99199.75332 122009.1440 1.0000000
Levilactobacillus-Agathobaculum 113948.65278 -70108.27534 298005.5809 0.9638801
Liquorilactobacillus-Agathobaculum 3187.65278 -180869.27534 187244.5809 1.0000000
Listeria-Agathobaculum 72794.33744 -34487.89572 180076.5706 0.8710198
[ reached getOption("max.print") -- omitted 1346 rows ]
TukeyHSD(block, which = c("predicted_label", "f_spor"))
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = Genome.Length..bp. ~ predicted_label + f_spor + Host, data = inph.all)
$predicted_label
diff lwr upr p adj
virulent-temperate 39312.13 36778.2 41846.05 0
$f_spor
diff lwr upr p adj
TRUE-FALSE 20058.93 17128.38 22989.48 0
tkey
Error: object 'tkey' not found
gc.spor <- ggplot(inph.spor, aes(x = factor(predicted_label), fill = factor(predicted_label), y = molGC....)) +
geom_boxplot(binaxis = "y", stackdir = "center", position = "dodge") + geom_jitter(width = 0.2) + scale_fill_manual(values=pal2, labels = c ("Temperate", "Lytic")) + ylab("GC %") + xlab("") + ggtitle("") + labs(fill="Lifestyle")+ ylim(0, 75)
Warning: Ignoring unknown parameters: `binaxis` and `stackdir`
inph.no <- subset(inph.all, inph.all$f_spor==FALSE)
gc.no <- ggplot(inph.no, aes(x = factor(predicted_label), fill = factor(predicted_label), y = molGC....)) +
geom_boxplot(binaxis = "y", stackdir = "center", position = "dodge") + geom_jitter(width = 0.2) + scale_fill_manual(values=pal2, labels = c ("Temperate", "Lytic")) + ylab("GC %") + xlab("") + ggtitle("") + labs(fill="Lifestyle") + ylim(0, 75) + theme(legend.position = "none")
Warning: Ignoring unknown parameters: `binaxis` and `stackdir`
gc.amount <- plot_grid(gc.no, gc.spor, labels = c('Nonsporulating Host', 'Sporulating Host'), label_size = 12, rel_widths = c(1.5, 2))
gc.amount

pairs(em)
contrast estimate SE df t.ratio p.value
temperate FALSE - virulent FALSE -0.127 0.116 3285 -1.096 0.6922
temperate FALSE - temperate TRUE 0.897 0.488 3285 1.837 0.2560
temperate FALSE - virulent TRUE 0.770 0.509 3285 1.514 0.4292
virulent FALSE - temperate TRUE 1.023 0.494 3285 2.070 0.1630
virulent FALSE - virulent TRUE 0.897 0.488 3285 1.837 0.2560
temperate TRUE - virulent TRUE -0.127 0.116 3285 -1.096 0.6922
Results are averaged over the levels of: Host
P value adjustment: tukey method for comparing a family of 4 estimates
tRNA.spor <- ggplot(inph.spor, aes(x = factor(predicted_label), fill = factor(predicted_label), y = tRNAs)) +
geom_boxplot(binaxis = "y", stackdir = "center", position = "dodge") + geom_jitter(width = 0.2) + scale_fill_manual(values=pal2, labels = c ("Temperate", "Lytic")) + ylab("# of tRNAs") + xlab("") + ggtitle("") + labs(fill="Lifestyle")+ ylim(0, 30)
Warning: Ignoring unknown parameters: `binaxis` and `stackdir`
inph.no <- subset(inph.all, inph.all$f_spor==FALSE)
tRNA.no <-ggplot(inph.no, aes(x = factor(predicted_label), fill = factor(predicted_label), y = tRNAs)) +
geom_boxplot(binaxis = "y", stackdir = "center", position = "dodge") + geom_jitter(width = 0.2) + scale_fill_manual(values=pal2, labels = c ("Temperate", "Lytic")) + ylab("# of tRNAs") + xlab("") + ggtitle("") + labs(fill="Lifestyle") + ylim(0, 30) + theme(legend.position="none")
Warning: Ignoring unknown parameters: `binaxis` and `stackdir`
tRNA.amount <- plot_grid(tRNA.no, tRNA.spor, labels = c('Nonsporulating Host', 'Sporulating Host'), label_size = 12, rel_widths = c(1.5, 2))
Warning: Removed 847 rows containing missing values or values outside the scale range (`geom_point()`).Warning: Removed 310 rows containing missing values or values outside the scale range (`geom_point()`).
tRNA.amount

twoway_block <- aov(tRNAs ~ predicted_label+ f_spor+Host, data = inph.all)
summary(twoway_block)
Df Sum Sq Mean Sq F value Pr(>F)
predicted_label 1 4293 4293 417.102 < 2e-16 ***
f_spor 1 106 106 10.255 0.00138 **
Host 55 4169 76 7.363 < 2e-16 ***
Residuals 3285 33814 10
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
library(emmeans)
em <- emmeans(twoway_block, ~ predicted_label * f_spor)
NOTE: A nesting structure was detected in the fitted model:
Host %in% f_spor
pairs(em)
contrast estimate SE df t.ratio p.value
temperate FALSE - virulent FALSE -2.09 0.136 3285 -15.364 <.0001
temperate FALSE - temperate TRUE 0.59 0.575 3285 1.025 0.7346
temperate FALSE - virulent TRUE -1.50 0.599 3285 -2.504 0.0595
virulent FALSE - temperate TRUE 2.68 0.582 3285 4.603 <.0001
virulent FALSE - virulent TRUE 0.59 0.575 3285 1.025 0.7346
temperate TRUE - virulent TRUE -2.09 0.136 3285 -15.364 <.0001
Results are averaged over the levels of: Host
P value adjustment: tukey method for comparing a family of 4 estimates
### lifestyle and sporulation have impact on tRNAs
## nonsporulating temp vs. virulent are different
## sporulating temp and virulent are different
## Virulent NON-SPOR and virulent SPOR are different p=0.0125
## Temperate NON-SPOR and Temperate SPOR are different, p= 0.0125
CDS.spor <- ggplot(inph.spor, aes(x = factor(predicted_label), fill = factor(predicted_label), y = Number.CDS)) +
geom_boxplot(binaxis = "y", stackdir = "center", position = "dodge") + geom_jitter(width = 0.2) + scale_fill_manual(values=pal2, labels = c ("Temperate", "Lytic")) + ylab("# of Coding Regions") + xlab("") + ggtitle("") + labs(fill="Lifestyle")+ ylim(0, 350)
Warning: Ignoring unknown parameters: `binaxis` and `stackdir`
inph.no <- subset(inph.all, inph.all$f_spor==FALSE)
CDS.no <- ggplot(inph.no, aes(x = factor(predicted_label), fill = factor(predicted_label), y = Number.CDS)) +
geom_boxplot(binaxis = "y", stackdir = "center", position = "dodge") + geom_jitter(width = 0.2) + scale_fill_manual(values=pal2, labels = c ("Temperate", "Lytic")) + ylab("# of Coding Regions") + xlab("") + ggtitle("") + labs(fill="Lifestyle") + ylim(0, 350) + theme(legend.position="none")
Warning: Ignoring unknown parameters: `binaxis` and `stackdir`
CDS.amount <- plot_grid(CDS.no, CDS.spor, labels = c('Nonsporulating Host', 'Sporulating Host'), label_size = 12, rel_widths = c(1.5, 2))
Warning: Removed 1 row containing non-finite outside the scale range (`stat_boxplot()`).Warning: Removed 1 row containing missing values or values outside the scale range (`geom_point()`).
CDS.amount

twoway <- aov(Number.CDS ~ predicted_label+ f_spor+Host, data = inph.all)
## lifestyle and sporulation both an impact on number of CDS
summary(twoway)
Df Sum Sq Mean Sq F value Pr(>F)
predicted_label 1 3216516 3216516 1165.4 <2e-16 ***
f_spor 1 782157 782157 283.4 <2e-16 ***
Host 55 3157901 57416 20.8 <2e-16 ***
Residuals 3285 9066256 2760
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
library(emmeans)
em <- emmeans(twoway, ~ predicted_label * f_spor)
NOTE: A nesting structure was detected in the fitted model:
Host %in% f_spor
pairs(em)
contrast estimate SE df t.ratio p.value
temperate FALSE - virulent FALSE -63.8 2.23 3285 -28.640 <.0001
temperate FALSE - temperate TRUE -13.3 9.41 3285 -1.418 0.4881
temperate FALSE - virulent TRUE -77.1 9.81 3285 -7.862 <.0001
virulent FALSE - temperate TRUE 50.4 9.53 3285 5.292 <.0001
virulent FALSE - virulent TRUE -13.3 9.41 3285 -1.418 0.4881
temperate TRUE - virulent TRUE -63.8 2.23 3285 -28.640 <.0001
Results are averaged over the levels of: Host
P value adjustment: tukey method for comparing a family of 4 estimates
## lifestyle and sporulation both an impact on number of CDS <0.001
## all groups (e.g. temperate non-spor vs. temperate spor) are different from each other!
ggsave(here("data/inphared_db/inphared_desc.png"))
Saving 7 x 7 in image
#inph.spor
#inph.no
library(ggpubr)
gvT <- ggplot(inph.all, aes(Genome.Length..bp., tRNAs, fill=phage_type, colour = phage_type, shape = f_spor)) +
geom_point() +
geom_smooth(method="lm")+ # Add regression line
stat_regline_equation(aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~~")),
label.x.npc = "middle", label.y.npc = "top" )# Add equation#+ ylim(0, 25) #+ xlim(0, 400000)
cvT <- ggplot(inph.all, aes(Number.CDS, tRNAs, fill=phage_type, colour = phage_type, shape = f_spor)) +
geom_point() +
geom_smooth(method="lm")+ # Add regression line
stat_regline_equation(aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~~")),
label.x.npc = "middle", label.y.npc = "top" )# Add equation#+ ylim(0, 25) #+ xlim(0, 400000)
MvT <- ggplot(inph.all, aes(molGC...., tRNAs, fill=phage_type, colour = phage_type, shape = f_spor)) +
geom_point() +
geom_smooth(method="lm")+ # Add regression line
stat_regline_equation(aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~~")),
label.x.npc = "middle", label.y.npc = "top" )# Add equation#+ ylim(0, 25) #+ xlim(0, 400000)
MvT ## not interesting lol

gvC <- ggplot(inph.all, aes(Genome.Length..bp., Number.CDS, fill=phage_type, colour = phage_type, shape = f_spor)) +
geom_point() +
geom_smooth(method="lm")+ # Add regression line
stat_regline_equation(aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~~")),
label.x.npc = "left", label.y.npc = "top" )# Add equation#+ ylim(0, 25) #+ xlim(0, 400000)
GvGC <- ggplot(inph.all, aes(Genome.Length..bp., molGC...., fill=phage_type, colour = phage_type, shape = f_spor)) +
geom_point() + geom_smooth(method="lm") +
stat_regline_equation(aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~~")),
label.x.npc = "middle", label.y.npc = "top" )
GvGC

all.line <- plot_grid(
gvT, cvT, gvC, GvGC, ncol=1)
`geom_smooth()` using formula = 'y ~ x'`geom_smooth()` using formula = 'y ~ x'`geom_smooth()` using formula = 'y ~ x'`geom_smooth()` using formula = 'y ~ x'
# labels = c('Genome Size', 'GC %', 'Predicted CD Regions', 'Predicted tRNAs'), ncol = 1)
all.line
ggsave(here("data/inphared_db/inphared_linear.png"), height=11, width=8)

NA
NA
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGhlcmUpCmxpYnJhcnkoY293cGxvdCkKaGVyZSgiUkVBRE1FLm1kIikKZHJfaGVyZSgpCgpwYWwyIDwtIGMoIiMwMTViNTgiLCAiIzU5NjJiNSIpCnBhbDIuZmxpcCA8LSBjKCIjNTk2MmI1IiwgIiMwMTViNTgiKQppbnBoIDwtIHJlYWQuY3N2KCJkYXRhL2lucGhhcmVkX2RiLzE0QXByMjAyNV9rbm93bnNwb3Jlc3RhdHVzLmNzdiIsIHJvdy5uYW1lcz0xKQppbnBoJHNwb3J1bGF0aW9uIDwtICJUIgppbnBoJHNwb3J1bGF0aW9uIDwtIGlmZWxzZShpbnBoJGZfc3Bvcj09VFJVRSwgIlNwcm91bGF0aW5nSG9zdCIsICJOb25zcG9ydWxhdGluZ0hvc3QiKQoKaW5waCA8LSB1bml0ZShpbnBoLCAicGhhZ2VfdHlwZSIsIGMoInNwb3J1bGF0aW9uIiwgInByZWRpY3RlZF9sYWJlbCIpLCBzZXAgPSAiXyIsIHJlbW92ZSA9IEZBTFNFLCBuYS5ybSA9IEZBTFNFKQoKCmBgYAoKIyMjIGNvbXBhcmUgZ2Vub21lIHNpemUgb2YgdGVtcGVyYXRlIHZzLiBseXRpYwpgYGB7cn0KaW5waC5hbGwgPC0gaW5waAojaW5waDwtIHN1YnNldChpbnBoLmFsbCwgaW5waC5hbGwkSnVtYm9waGFnZT09RkFMU0UpCgoKZ2dwbG90KGlucGguYWxsLCBhZXMoeCA9IGZhY3RvcihmX3Nwb3IpLCBmaWxsID0gZmFjdG9yKHByZWRpY3RlZF9sYWJlbCksIHkgPSBHZW5vbWUuTGVuZ3RoLi5icC4pKSArIAogIGdlb21fYm94cGxvdChiaW5heGlzID0gInkiLCBzdGFja2RpciA9ICJjZW50ZXIiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIpICArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1wYWwyLCBsYWJlbHMgPSBjICgiVGVtcGVyYXRlIiwgIkx5dGljIikpICsgeWxhYigiUGhhZ2UgR2Vub21lIFNpemUgKGJwKSIpICsgeGxhYigiIikgKyBnZ3RpdGxlKCJJTlBIQVJFRCwgd2l0aCBqdW1ib3BoYWdlcyIpICsgbGFicyhmaWxsPSJMaWZlc3R5bGUiKQoKCiMgZ2dwbG90KGlucGgsIGFlcyh4ID0gZmFjdG9yKGZfc3BvciksIGZpbGwgPSBmYWN0b3IocHJlZGljdGVkX2xhYmVsKSwgeSA9IEdlbm9tZS5MZW5ndGguLmJwLikpIAojICBnZW9tX2JveHBsb3QoYmluYXhpcyA9ICJ5Iiwgc3RhY2tkaXIgPSAiY2VudGVyIiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1wYWwyLCBsYWJlbHMgPSBjICgiVGVtcGVyYXRlIiwgIkx5dGljIikpICsgeWxhYigiUGhhZ2UgIyBHZW5vbWUgU2l6ZSAoYnApIikgKyB4bGFiKCIiKSArIGdndGl0bGUoIklOUEhBUkVELCBubyBqdW1ib3BoYWdlcyIpICsgbGFicyhmaWxsPSJMaWZlc3R5bGUiKQogIAogIAogIAogIAogIAppbnBoLnNwb3IgPC0gc3Vic2V0KGlucGguYWxsLCBpbnBoLmFsbCRmX3Nwb3I9PVRSVUUpICAKCnNpemUuc3BvciA8LSBnZ3Bsb3QoaW5waC5zcG9yLCBhZXMoeCA9IGZhY3RvcihwcmVkaWN0ZWRfbGFiZWwpLCBmaWxsID0gZmFjdG9yKHByZWRpY3RlZF9sYWJlbCksIHkgPSBHZW5vbWUuTGVuZ3RoLi5icC4pKSArIAogIGdlb21fYm94cGxvdChiaW5heGlzID0gInkiLCBzdGFja2RpciA9ICJjZW50ZXIiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIpICArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1wYWwyLCBsYWJlbHMgPSBjICgiVGVtcGVyYXRlIiwgIkx5dGljIikpICsgeWxhYigiUGhhZ2UgR2Vub21lIFNpemUgKGJwKSIpICsgeGxhYigiIikgKyBnZ3RpdGxlKCIiKSArIGxhYnMoZmlsbD0iTGlmZXN0eWxlIikrIHlsaW0oMCwgMTAwMDAwMCkKCgoKaW5waC5ubyA8LSBzdWJzZXQoaW5waC5hbGwsIGlucGguYWxsJGZfc3Bvcj09RkFMU0UpICAKCnNpemUubm8gPC0gZ2dwbG90KGlucGgubm8sIGFlcyh4ID0gZmFjdG9yKHByZWRpY3RlZF9sYWJlbCksIGZpbGwgPSBmYWN0b3IocHJlZGljdGVkX2xhYmVsKSwgeSA9IEdlbm9tZS5MZW5ndGguLmJwLikpICsgCiAgZ2VvbV9ib3hwbG90KGJpbmF4aXMgPSAieSIsIHN0YWNrZGlyID0gImNlbnRlciIsIHBvc2l0aW9uID0gImRvZGdlIikgKyBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMikgICsgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPXBhbDIsIGxhYmVscyA9IGMgKCJUZW1wZXJhdGUiLCAiTHl0aWMiKSkgKyB5bGFiKCJQaGFnZSBHZW5vbWUgU2l6ZSAoYnApIikgKyB4bGFiKCIiKSArIGdndGl0bGUoIiIpICsgbGFicyhmaWxsPSJMaWZlc3R5bGUiKSArIHlsaW0oMCwgMTAwMDAwMCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCgoKCmdlbm9tZS5zaXplIDwtIHBsb3RfZ3JpZChzaXplLm5vLCBzaXplLnNwb3IsIGxhYmVscyA9IGMoJ05vbnNwb3J1bGF0aW5nIEhvc3QnLCAnU3BvcnVsYXRpbmcgSG9zdCcpLCBsYWJlbF9zaXplID0gMTIsIHJlbF93aWR0aHMgPSBjKDEuNSwgMikpCgpnZW5vbWUuc2l6ZQpgYGAKCgpgYGB7cn0KCmlucGguYWxsJGZfc3BvciA8LSBhcy5mYWN0b3IoaW5waC5hbGwkZl9zcG9yKQppbnBoLmFsbCRwcmVkaWN0ZWRfbGFiZWwgPC0gYXMuZmFjdG9yKGlucGguYWxsJHByZWRpY3RlZF9sYWJlbCkKaW5waC5hbGwkSG9zdCA8LSBhcy5mYWN0b3IoaW5waC5hbGwkSG9zdCkKCiNpbnBoIDwtIHN1YnNldChpbnBoLCBpbnBoJEp1bWJvcGhhZ2U9PUZBTFNFKQoKb25ld2F5IDwtIGFvdihHZW5vbWUuTGVuZ3RoLi5icC4gfiBwcmVkaWN0ZWRfbGFiZWwsIGRhdGEgPSBpbnBoLmFsbCkKCnN1bW1hcnkob25ld2F5KQoKCnR3b3dheSA8LSBhb3YoR2Vub21lLkxlbmd0aC4uYnAuIH4gcHJlZGljdGVkX2xhYmVsICsgZl9zcG9yLCBkYXRhID0gaW5waC5hbGwpCgpzdW1tYXJ5KHR3b3dheSkKCgp0d293YXkuaW50IDwtIGFvdihHZW5vbWUuTGVuZ3RoLi5icC4gfiBwcmVkaWN0ZWRfbGFiZWwgKiBmX3Nwb3IsIGRhdGEgPSBpbnBoLmFsbCkKCnN1bW1hcnkodHdvd2F5LmludCkKCgpibG9jayA8LSBhb3YoR2Vub21lLkxlbmd0aC4uYnAuIH5wcmVkaWN0ZWRfbGFiZWwgKyBmX3Nwb3IgKyBIb3N0LCBkYXRhID0gaW5waC5hbGwpCgpzdW1tYXJ5KGJsb2NrKQoKYmxvY2tfaW50IDwtIGFvdihHZW5vbWUuTGVuZ3RoLi5icC4gfiBwcmVkaWN0ZWRfbGFiZWwgKyBmX3Nwb3IgKiBIb3N0LCBkYXRhID0gaW5waC5hbGwpCnN1bW1hcnkoYmxvY2tfaW50KQphbGxfaW50IDwtIGFvdihHZW5vbWUuTGVuZ3RoLi5icC4gfiBwcmVkaWN0ZWRfbGFiZWwgKiBmX3Nwb3IgKiBIb3N0LCBkYXRhID0gaW5waC5hbGwpCnN1bW1hcnkoYWxsX2ludCkKCmxpYnJhcnkoQUlDY21vZGF2ZykKCm1vZGVsLnNldCA8LSBsaXN0KG9uZXdheSwgdHdvd2F5LCB0d293YXkuaW50LCBibG9jaywgYmxvY2tfaW50KQptb2RlbC5uYW1lcyA8LSBjKCJvbmUud2F5IiwgInR3by53YXkiLCAiaW50ZXJhY3Rpb24iLCAiYmxvY2tpbmciLCAiYmxvY2tfaW50IikKCmFpY3RhYihtb2RlbC5zZXQsIG1vZG5hbWVzID0gbW9kZWwubmFtZXMpCgpwYXIobWZyb3c9YygyLDIpKQpwbG90KHR3b3dheS5pbnQpCnBhcihtZnJvdz1jKDEsMSkpCgp0ZXJtcyhibG9jaykKClR1a2V5SFNEKGJsb2NrKSAgIyBvcjoKVHVrZXlIU0QoYmxvY2ssIHdoaWNoID0gYygicHJlZGljdGVkX2xhYmVsIiwgImZfc3BvciIpKQoKCnRrZXkKCmtydXNrYWwudGVzdChwcmVkaWN0ZWRfbGFiZWwgfiBHZW5vbWUuTGVuZ3RoLi5icC4sIGRhdGEgPSBpbnBoKQoKCgoKbGlicmFyeShlbW1lYW5zKQplbSA8LSBlbW1lYW5zKGJsb2NrLCB+IHByZWRpY3RlZF9sYWJlbCAqIGZfc3BvcikKcGFpcnMoZW0pCgojIyBubyBzcG9yIHRlbXAgdnMuIHZpciwgZGlmZmVyZW50CiMjIHNwb3IgdGVtcCB2cy4gdmlyLCBkaWZmZXJlbnQKCiMjIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiBzcG9yIHRlbXAgYW5kIG5vbnNwb3IgdGVtcAojIyBubyBkaWZmZXJlbmNlIGJldHdlZW4gc3BvciB2aXIgYW5kIG5vbnNwb3IgdmlyCgoKYGBgCgpgYGB7cn0KZ2Muc3BvciA8LSBnZ3Bsb3QoaW5waC5zcG9yLCBhZXMoeCA9IGZhY3RvcihwcmVkaWN0ZWRfbGFiZWwpLCBmaWxsID0gZmFjdG9yKHByZWRpY3RlZF9sYWJlbCksIHkgPSBtb2xHQy4uLi4pKSArIAogIGdlb21fYm94cGxvdChiaW5heGlzID0gInkiLCBzdGFja2RpciA9ICJjZW50ZXIiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIpICArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1wYWwyLCBsYWJlbHMgPSBjICgiVGVtcGVyYXRlIiwgIkx5dGljIikpICsgeWxhYigiR0MgJSIpICsgeGxhYigiIikgKyBnZ3RpdGxlKCIiKSArIGxhYnMoZmlsbD0iTGlmZXN0eWxlIikrIHlsaW0oMCwgNzUpCgoKCmlucGgubm8gPC0gc3Vic2V0KGlucGguYWxsLCBpbnBoLmFsbCRmX3Nwb3I9PUZBTFNFKSAgCgpnYy5ubyA8LSBnZ3Bsb3QoaW5waC5ubywgYWVzKHggPSBmYWN0b3IocHJlZGljdGVkX2xhYmVsKSwgZmlsbCA9IGZhY3RvcihwcmVkaWN0ZWRfbGFiZWwpLCB5ID0gbW9sR0MuLi4uKSkgKyAKICBnZW9tX2JveHBsb3QoYmluYXhpcyA9ICJ5Iiwgc3RhY2tkaXIgPSAiY2VudGVyIiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArIGdlb21faml0dGVyKHdpZHRoID0gMC4yKSAgKyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9cGFsMiwgbGFiZWxzID0gYyAoIlRlbXBlcmF0ZSIsICJMeXRpYyIpKSArIHlsYWIoIkdDICUiKSArIHhsYWIoIiIpICsgZ2d0aXRsZSgiIikgKyBsYWJzKGZpbGw9IkxpZmVzdHlsZSIpICsgeWxpbSgwLCA3NSkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCgoKCgpnYy5hbW91bnQgPC0gcGxvdF9ncmlkKGdjLm5vLCBnYy5zcG9yLCBsYWJlbHMgPSBjKCdOb25zcG9ydWxhdGluZyBIb3N0JywgJ1Nwb3J1bGF0aW5nIEhvc3QnKSwgbGFiZWxfc2l6ZSA9IDEyLCByZWxfd2lkdGhzID0gYygxLjUsIDIpKQoKZ2MuYW1vdW50CmBgYAoKCmBgYHtyfQoKaW5waC5hbGwkZl9zcG9yIDwtIGFzLmZhY3RvcihpbnBoLmFsbCRmX3Nwb3IpCmlucGguYWxsJHByZWRpY3RlZF9sYWJlbCA8LSBhcy5mYWN0b3IoaW5waC5hbGwkcHJlZGljdGVkX2xhYmVsKQppbnBoLmFsbCRIb3N0IDwtIGFzLmZhY3RvcihpbnBoLmFsbCRIb3N0KQoKI2lucGggPC0gc3Vic2V0KGlucGgsIGlucGgkSnVtYm9waGFnZT09RkFMU0UpCgpvbmV3YXkgPC0gYW92KG1vbEdDLi4uLiB+IHByZWRpY3RlZF9sYWJlbCwgZGF0YSA9IGlucGguYWxsKQoKc3VtbWFyeShvbmV3YXkpCgoKdHdvd2F5IDwtIGFvdihtb2xHQy4uLi4gfiBwcmVkaWN0ZWRfbGFiZWwgKyBmX3Nwb3IsIGRhdGEgPSBpbnBoLmFsbCkKCnN1bW1hcnkodHdvd2F5KQoKCnR3b3dheS5pbnQgPC0gYW92KG1vbEdDLi4uLiB+IHByZWRpY3RlZF9sYWJlbCAqIGZfc3BvciwgZGF0YSA9IGlucGguYWxsKQoKc3VtbWFyeSh0d293YXkuaW50KQoKCmJsb2NrIDwtIGFvdihtb2xHQy4uLi4gfnByZWRpY3RlZF9sYWJlbCArIGZfc3BvciArIEhvc3QsIGRhdGEgPSBpbnBoLmFsbCkKCnN1bW1hcnkoYmxvY2spCgpibG9ja19pbnQgPC0gYW92KG1vbEdDLi4uLiB+IHByZWRpY3RlZF9sYWJlbCArIGZfc3BvciAqIEhvc3QsIGRhdGEgPSBpbnBoLmFsbCkKc3VtbWFyeShibG9ja19pbnQpCmFsbF9pbnQgPC0gYW92KG1vbEdDLi4uLiB+IHByZWRpY3RlZF9sYWJlbCAqIGZfc3BvciAqIEhvc3QsIGRhdGEgPSBpbnBoLmFsbCkKc3VtbWFyeShhbGxfaW50KQoKbGlicmFyeShBSUNjbW9kYXZnKQoKbW9kZWwuc2V0IDwtIGxpc3Qob25ld2F5LCB0d293YXksIHR3b3dheS5pbnQsIGJsb2NrLCBibG9ja19pbnQpCm1vZGVsLm5hbWVzIDwtIGMoIm9uZS53YXkiLCAidHdvLndheSIsICJpbnRlcmFjdGlvbiIsICJibG9ja2luZyIsICJibG9ja19pbnQiKQoKYWljdGFiKG1vZGVsLnNldCwgbW9kbmFtZXMgPSBtb2RlbC5uYW1lcykKc3VtbWFyeShibG9jaykKCnBhcihtZnJvdz1jKDIsMikpCnBsb3QodHdvd2F5LmludCkKcGFyKG1mcm93PWMoMSwxKSkKCnRlcm1zKGJsb2NrKQoKVHVrZXlIU0QoYmxvY2spICAjIG9yOgoKCgp0a2V5CgprcnVza2FsLnRlc3QocHJlZGljdGVkX2xhYmVsIH4gbW9sR0MuLi4uLCBkYXRhID0gaW5waCkKCgoKCmxpYnJhcnkoZW1tZWFucykKZW0gPC0gZW1tZWFucyhibG9jaywgfiBwcmVkaWN0ZWRfbGFiZWwgKiBmX3Nwb3IpCnBhaXJzKGVtKQoKIyMjIG5vIGVmZmVjdCAKbgoKYGBgCgoKYGBge3J9CnRSTkEuc3BvciA8LSAgZ2dwbG90KGlucGguc3BvciwgYWVzKHggPSBmYWN0b3IocHJlZGljdGVkX2xhYmVsKSwgZmlsbCA9IGZhY3RvcihwcmVkaWN0ZWRfbGFiZWwpLCB5ID0gdFJOQXMpKSArIAogIGdlb21fYm94cGxvdChiaW5heGlzID0gInkiLCBzdGFja2RpciA9ICJjZW50ZXIiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIpICArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1wYWwyLCBsYWJlbHMgPSBjICgiVGVtcGVyYXRlIiwgIkx5dGljIikpICsgeWxhYigiIyBvZiB0Uk5BcyIpICsgeGxhYigiIikgKyBnZ3RpdGxlKCIiKSArIGxhYnMoZmlsbD0iTGlmZXN0eWxlIikrIHlsaW0oMCwgMzApCgoKCmlucGgubm8gPC0gc3Vic2V0KGlucGguYWxsLCBpbnBoLmFsbCRmX3Nwb3I9PUZBTFNFKSAgCgp0Uk5BLm5vIDwtZ2dwbG90KGlucGgubm8sIGFlcyh4ID0gZmFjdG9yKHByZWRpY3RlZF9sYWJlbCksIGZpbGwgPSBmYWN0b3IocHJlZGljdGVkX2xhYmVsKSwgeSA9IHRSTkFzKSkgKyAKICBnZW9tX2JveHBsb3QoYmluYXhpcyA9ICJ5Iiwgc3RhY2tkaXIgPSAiY2VudGVyIiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArIGdlb21faml0dGVyKHdpZHRoID0gMC4yKSAgKyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9cGFsMiwgbGFiZWxzID0gYyAoIlRlbXBlcmF0ZSIsICJMeXRpYyIpKSArIHlsYWIoIiMgb2YgdFJOQXMiKSArIHhsYWIoIiIpICsgZ2d0aXRsZSgiIikgKyBsYWJzKGZpbGw9IkxpZmVzdHlsZSIpICsgeWxpbSgwLCAzMCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQoKCnRSTkEuYW1vdW50IDwtIHBsb3RfZ3JpZCh0Uk5BLm5vLCB0Uk5BLnNwb3IsIGxhYmVscyA9IGMoJ05vbnNwb3J1bGF0aW5nIEhvc3QnLCAnU3BvcnVsYXRpbmcgSG9zdCcpLCBsYWJlbF9zaXplID0gMTIsIHJlbF93aWR0aHMgPSBjKDEuNSwgMikpCgp0Uk5BLmFtb3VudAoKdHdvd2F5X2Jsb2NrIDwtIGFvdih0Uk5BcyB+IHByZWRpY3RlZF9sYWJlbCsgZl9zcG9yK0hvc3QsIGRhdGEgPSBpbnBoLmFsbCkKCnN1bW1hcnkodHdvd2F5X2Jsb2NrKQoKbGlicmFyeShlbW1lYW5zKQplbSA8LSBlbW1lYW5zKHR3b3dheV9ibG9jaywgfiBwcmVkaWN0ZWRfbGFiZWwgKiBmX3Nwb3IpCnBhaXJzKGVtKQoKIyMjIGxpZmVzdHlsZSwgc3BvcnVsYXRpb24sIGFuZCBob3N0LCBoYXZlIGltcGFjdCBvbiB0Uk5BcyAKIyMgbm9uIHNwb3IgdmlyIHZzLiBzcG9yIHRlbXAgYXJlIGRpZmZlcmVudAojIyBzcG9yIHZpciB2cy4gc3BvciB0ZW1wIGFyZSBkaWZmZW50CgojIyB2aXIgc3BvciB2cy4gbm9uIHNwb3IgYXJlIE5PVCBkaWZmZXJlbnQKIyMgdGVtcCBzcG9yIHZzLiBub24gc3BvciBBUkUgTk9UIGRpZmZlcmVudAoKYGBgCgoKYGBge3J9CkNEUy5zcG9yIDwtIGdncGxvdChpbnBoLnNwb3IsIGFlcyh4ID0gZmFjdG9yKHByZWRpY3RlZF9sYWJlbCksIGZpbGwgPSBmYWN0b3IocHJlZGljdGVkX2xhYmVsKSwgeSA9IE51bWJlci5DRFMpKSArIAogIGdlb21fYm94cGxvdChiaW5heGlzID0gInkiLCBzdGFja2RpciA9ICJjZW50ZXIiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIpICArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1wYWwyLCBsYWJlbHMgPSBjICgiVGVtcGVyYXRlIiwgIkx5dGljIikpICsgeWxhYigiIyBvZiBDb2RpbmcgUmVnaW9ucyIpICsgeGxhYigiIikgKyBnZ3RpdGxlKCIiKSArIGxhYnMoZmlsbD0iTGlmZXN0eWxlIikrIHlsaW0oMCwgMzUwKQoKCgppbnBoLm5vIDwtIHN1YnNldChpbnBoLmFsbCwgaW5waC5hbGwkZl9zcG9yPT1GQUxTRSkgIAoKQ0RTLm5vIDwtIGdncGxvdChpbnBoLm5vLCBhZXMoeCA9IGZhY3RvcihwcmVkaWN0ZWRfbGFiZWwpLCBmaWxsID0gZmFjdG9yKHByZWRpY3RlZF9sYWJlbCksIHkgPSBOdW1iZXIuQ0RTKSkgKyAKICBnZW9tX2JveHBsb3QoYmluYXhpcyA9ICJ5Iiwgc3RhY2tkaXIgPSAiY2VudGVyIiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArIGdlb21faml0dGVyKHdpZHRoID0gMC4yKSAgKyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9cGFsMiwgbGFiZWxzID0gYyAoIlRlbXBlcmF0ZSIsICJMeXRpYyIpKSArIHlsYWIoIiMgb2YgQ29kaW5nIFJlZ2lvbnMiKSArIHhsYWIoIiIpICsgZ2d0aXRsZSgiIikgKyBsYWJzKGZpbGw9IkxpZmVzdHlsZSIpICsgeWxpbSgwLCAzNTApICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKCgpDRFMuYW1vdW50IDwtIHBsb3RfZ3JpZChDRFMubm8sIENEUy5zcG9yLCBsYWJlbHMgPSBjKCdOb25zcG9ydWxhdGluZyBIb3N0JywgJ1Nwb3J1bGF0aW5nIEhvc3QnKSwgbGFiZWxfc2l6ZSA9IDEyLCByZWxfd2lkdGhzID0gYygxLjUsIDIpKQoKQ0RTLmFtb3VudAoKCnR3b3dheSA8LSBhb3YoTnVtYmVyLkNEUyB+IHByZWRpY3RlZF9sYWJlbCsgZl9zcG9yK0hvc3QsIGRhdGEgPSBpbnBoLmFsbCkKIyMgbGlmZXN0eWxlIGFuZCBzcG9ydWxhdGlvbiBib3RoIGFuIGltcGFjdCBvbiBudW1iZXIgb2YgQ0RTCgoKCnN1bW1hcnkodHdvd2F5KQoKbGlicmFyeShlbW1lYW5zKQplbSA8LSBlbW1lYW5zKHR3b3dheSwgfiBwcmVkaWN0ZWRfbGFiZWwgKiBmX3Nwb3IpCnBhaXJzKGVtKQoKIyMgbGlmZXN0eWxlIGFuZCBzcG9ydWxhdGlvbiBib3RoIGFuIGltcGFjdCBvbiBudW1iZXIgb2YgQ0RTIDwwLjAwMQoKIyMgbm9uc3BvciB0ZW1wIHZzLiB2aXIgYXJlIGRpZmZlcmVudAojIyBzcG9yIHRlbXAgdnMuIHZpciBhcmUgZGlmZmVyZW50CgojIyB2aXIgc3BvciB2cy4gdmlyIG5vIHNwb3IgYXJlIE5PVCBkaWZmZXJlbnQKIyMgdGVtcCBzcG9yIHZzLiB0ZW1wIG5vIHNwb3IgYXJlIE5PVCBkaWZmZXJlbnQKCgpgYGAKYGBge3J9CmFsbCA8LSBwbG90X2dyaWQoCiAgZ2Vub21lLnNpemUsIGdjLmFtb3VudCwgQ0RTLmFtb3VudCwgdFJOQS5hbW91bnQsIG5jb2w9MSkKICMgbGFiZWxzID0gYygnR2Vub21lIFNpemUnLCAnR0MgJScsICdQcmVkaWN0ZWQgQ0QgUmVnaW9ucycsICdQcmVkaWN0ZWQgdFJOQXMnKSwgbmNvbCA9IDEpCgphbGwKCmdnc2F2ZShoZXJlKCJkYXRhL2lucGhhcmVkX2RiL2lucGhhcmVkX2Rlc2MucG5nIiksIGhlaWdodD0xMSwgd2lkdGg9OCkKCmBgYAoKYGBge3J9CiNpbnBoLnNwb3IgCiNpbnBoLm5vCgpsaWJyYXJ5KGdncHVicikKCmd2VCA8LSBnZ3Bsb3QoaW5waC5hbGwsIGFlcyhHZW5vbWUuTGVuZ3RoLi5icC4sIHRSTkFzLCBmaWxsPXBoYWdlX3R5cGUsIGNvbG91ciA9IHBoYWdlX3R5cGUsIHNoYXBlID0gZl9zcG9yKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpKyAjIEFkZCByZWdyZXNzaW9uIGxpbmUKIHN0YXRfcmVnbGluZV9lcXVhdGlvbihhZXMobGFiZWwgPSBwYXN0ZSguLmVxLmxhYmVsLi4sIC4ucnIubGFiZWwuLiwgc2VwID0gIn5+fn4iKSksCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsLngubnBjID0gIm1pZGRsZSIsIGxhYmVsLnkubnBjID0gInRvcCIgKSMgQWRkIGVxdWF0aW9uIysgeWxpbSgwLCAyNSkgIysgeGxpbSgwLCA0MDAwMDApCgoKY3ZUIDwtIGdncGxvdChpbnBoLmFsbCwgYWVzKE51bWJlci5DRFMsIHRSTkFzLCBmaWxsPXBoYWdlX3R5cGUsIGNvbG91ciA9IHBoYWdlX3R5cGUsIHNoYXBlID0gZl9zcG9yKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpKyAjIEFkZCByZWdyZXNzaW9uIGxpbmUKIHN0YXRfcmVnbGluZV9lcXVhdGlvbihhZXMobGFiZWwgPSBwYXN0ZSguLmVxLmxhYmVsLi4sIC4ucnIubGFiZWwuLiwgc2VwID0gIn5+fn4iKSksCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsLngubnBjID0gIm1pZGRsZSIsIGxhYmVsLnkubnBjID0gInRvcCIgKSMgQWRkIGVxdWF0aW9uIysgeWxpbSgwLCAyNSkgIysgeGxpbSgwLCA0MDAwMDApCgpNdlQgPC0gZ2dwbG90KGlucGguYWxsLCBhZXMobW9sR0MuLi4uLCB0Uk5BcywgZmlsbD1waGFnZV90eXBlLCBjb2xvdXIgPSBwaGFnZV90eXBlLCBzaGFwZSA9IGZfc3BvcikpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iKSsgIyBBZGQgcmVncmVzc2lvbiBsaW5lCiBzdGF0X3JlZ2xpbmVfZXF1YXRpb24oYWVzKGxhYmVsID0gcGFzdGUoLi5lcS5sYWJlbC4uLCAuLnJyLmxhYmVsLi4sIHNlcCA9ICJ+fn5+IikpLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbC54Lm5wYyA9ICJtaWRkbGUiLCBsYWJlbC55Lm5wYyA9ICJ0b3AiICkjIEFkZCBlcXVhdGlvbiMrIHlsaW0oMCwgMjUpICMrIHhsaW0oMCwgNDAwMDAwKQoKTXZUICAjIyBub3QgaW50ZXJlc3RpbmcgbG9sCgpndkMgPC0gZ2dwbG90KGlucGguYWxsLCBhZXMoR2Vub21lLkxlbmd0aC4uYnAuLCBOdW1iZXIuQ0RTLCBmaWxsPXBoYWdlX3R5cGUsIGNvbG91ciA9IHBoYWdlX3R5cGUsIHNoYXBlID0gZl9zcG9yKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpKyAjIEFkZCByZWdyZXNzaW9uIGxpbmUKIHN0YXRfcmVnbGluZV9lcXVhdGlvbihhZXMobGFiZWwgPSBwYXN0ZSguLmVxLmxhYmVsLi4sIC4ucnIubGFiZWwuLiwgc2VwID0gIn5+fn4iKSksCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsLngubnBjID0gImxlZnQiLCBsYWJlbC55Lm5wYyA9ICJ0b3AiICkjIEFkZCBlcXVhdGlvbiMrIHlsaW0oMCwgMjUpICMrIHhsaW0oMCwgNDAwMDAwKQoKCkd2R0MgPC0gZ2dwbG90KGlucGguYWxsLCBhZXMoR2Vub21lLkxlbmd0aC4uYnAuLCBtb2xHQy4uLi4sIGZpbGw9cGhhZ2VfdHlwZSwgY29sb3VyID0gcGhhZ2VfdHlwZSwgc2hhcGUgPSBmX3Nwb3IpKSArCiAgZ2VvbV9wb2ludCgpICsgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpICsKIHN0YXRfcmVnbGluZV9lcXVhdGlvbihhZXMobGFiZWwgPSBwYXN0ZSguLmVxLmxhYmVsLi4sIC4ucnIubGFiZWwuLiwgc2VwID0gIn5+fn4iKSksCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsLngubnBjID0gIm1pZGRsZSIsIGxhYmVsLnkubnBjID0gInRvcCIgKQpHdkdDCgphbGwubGluZSA8LSBwbG90X2dyaWQoCiAgZ3ZULCBjdlQsIGd2QywgR3ZHQywgbmNvbD0xKQogIyBsYWJlbHMgPSBjKCdHZW5vbWUgU2l6ZScsICdHQyAlJywgJ1ByZWRpY3RlZCBDRCBSZWdpb25zJywgJ1ByZWRpY3RlZCB0Uk5BcycpLCBuY29sID0gMSkKCmFsbC5saW5lCgpnZ3NhdmUoaGVyZSgiZGF0YS9pbnBoYXJlZF9kYi9pbnBoYXJlZF9saW5lYXIucG5nIiksIGhlaWdodD0xMSwgd2lkdGg9OCkKCgpgYGAKCg==